package com.ruoyi.merchant.config;

import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.server.standard.SpringConfigurator;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author 郭艳艳
 * @date 2024/9/13 20:44
 * @description WebSocketServer
 */
@ServerEndpoint(value = "/server/{userId}/{clientType}")
@Component
public class WebSocketServer {

    // 用于存储用户 WebSocket 连接的线程安全映射
    private static ConcurrentHashMap<String, WebSocketServer> userWebSocketMap = new ConcurrentHashMap<>();

    // 用于存储商家 WebSocket 连接的线程安全映射
    private static ConcurrentHashMap<String, WebSocketServer> shopWebSocketMap = new ConcurrentHashMap<>();

    private Session session; // 当前 WebSocket 会话
    private String userId = ""; // 用户 ID
    private String clientType = ""; // 客户端类型（用户或商家）


    // 当新连接打开时调用
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") String userId, @PathParam("clientType") String clientType) {
        this.session = session; // 保存当前会话
        this.userId = userId; // 保存用户 ID
        this.clientType = clientType; // 保存客户端类型

        // 将当前连接的 WebSocket 实例添加到相应的映射中
        if ("user".equals(clientType)) {
            userWebSocketMap.put(userId, this); // 用户连接
        } else if ("shop".equals(clientType)) {
            shopWebSocketMap.put(userId, this); // 商家连接
        }

        // 输出连接信息
        System.out.println("用户连接:" + userId + ",客户端类型:" + clientType + ",当前在线人数为:" + (userWebSocketMap.size() + shopWebSocketMap.size()));
        try {
            sendMessage("连接成功"); // 发送连接成功的消息
        } catch (IOException e) {
            System.err.println("用户:" + userId + ",网络异常!!!!!!"); // 处理网络异常
        }
    }

    // 当连接关闭时调用
    @OnClose
    public void onClose() {
        // 从相应的映射中移除当前连接
        if ("user".equals(clientType)) {
            userWebSocketMap.remove(userId); // 用户退出
        } else if ("shop".equals(clientType)) {
            shopWebSocketMap.remove(userId); // 商家退出
        }
        // 输出退出信息
        System.out.println("用户退出:" + userId + ",客户端类型:" + clientType + ",当前在线人数为:" + (userWebSocketMap.size() + shopWebSocketMap.size()));
    }

    // 当收到消息时调用
    @OnMessage
    public void onMessage(String message, Session session) {
        // 输出接收到的消息
        System.out.println("用户消息:" + userId + ",报文:" + message);
        try {
            sendMessage("收到信息:" + message); // 回应客户端收到的信息
        } catch (IOException e) {
            throw new RuntimeException(e); // 处理异常
        }
    }

    // 当发生错误时调用
    @OnError
    public void onError(Session session, Throwable error) {
        // 输出错误信息
        System.err.println("用户错误:" + this.userId + ",原因:" + error.getMessage());
        error.printStackTrace(); // 打印堆栈跟踪
    }

    // 发送消息给当前会话
    public void sendMessage(String message) throws IOException {
        this.session.getBasicRemote().sendText(message); // 通过 WebSocket 发送文本消息
    }

    // 静态方法，用于向指定用户发送信息
    public static void sendInfo(String message, String userId, String clientType) throws IOException {
        WebSocketServer webSocketServer = null;
        // 根据客户端类型获取对应的 WebSocket 实例
        if ("user".equals(clientType)) {
            webSocketServer = userWebSocketMap.get(userId); // 获取用户 WebSocket
        } else if ("shop".equals(clientType)) {
            webSocketServer = shopWebSocketMap.get(userId); // 获取商家 WebSocket
        }

        // 如果找到对应的 WebSocket 实例，则发送消息
        if (webSocketServer != null) {
            webSocketServer.sendMessage(message);
        } else {
            System.err.println("用户" + userId + "不在线！"); // 如果用户不在线，输出错误信息
        }
    }
}
